home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HyperLib 1997 Winter - Disc 1
/
HYPERLIB-1997-Winter-CD1.ISO.7z
/
HYPERLIB-1997-Winter-CD1.ISO
/
オンラインウェア
/
UTIL
/
Msh 1.0.0.sit
/
Msh 1.0.0 f
/
reexp.doc
< prev
next >
Wrap
Text File
|
1994-08-22
|
11KB
|
416 lines
正規表現ライブラリ
1. 正規表現
本ライブラリで使用できる正規表現は、次のものがあります。
(1) 英数字・特殊記号
正規表現の区切りを示す記号、および「¥「.^$*+?」以外の英数字、特殊文
字はそれと同じ文字に対応します。
(2) .(ピリオド)
改行を除く任意の一文字に対応します。
(3) ¥(逆スラッシュ)
この後に来る一文字に対応する。ただし、数字および「()<>ntfb|」は除
きます。これらは、以下のように対応します。
0xのあとの数字および(a−f)・・・16進数
0のあとの(0−7) ・・・ 8進数
n ・・・ 改行
f ・・・ 改頁
t ・・・ タブ
b ・・・ バックスペース
() ・・・ (6)参照(範囲指定)
<> ・・・ (12)参照(単語開始・終了)
1−9 ・・・ (7)参照(範囲参照)
| ・・・ (8)参照(論理和)
ただし、NULLコードの指定は、無視されます。
(4) [...]
「[]」で囲まれた文字列のうちどれか一文字に対応します。たとえば、[abc]
の場合a,b,cのうちどれか一文字に対応します。また「[]」の中では、−(
マイナス)を使ってASCII文字およびシフトJIS漢字コード順序による範囲
で指定することもできます。ただし、[a−]や[−b]や[−]といった指定は、
無視されますので注意して下さい。[]の中では、㈫の形式を使って指定すること
もできます。たとえば、「−」そのものを指定するときは、[¥−]のように指定
します。
(5) [^...]
[^と]で囲まれた文字列のうちどれにも対応しない文字に対応します。たとえば、
[^abd]の場合、a,b,cのどれにも対応しない文字と対応するわけです。
(4)と同様に「−」を使用することができます。
(6) ¥(...¥)
「¥(」と「¥)」で囲まれた(1)から(9)までの形の正規表現はその正規表現に対
応する文字列を示すか、もしくは、(8)の範囲を表します。
(7) ¥に続く1から9までの数字
「¥」に続く数字nはn番目の「¥(」と「¥)」で囲まれた正規表現に対応する
文字列に対応します。
(8) ¥|
¥|の右側の正規表現もしくは左側の正規表現の何れかにたいおうする。(6)によっ
てその範囲を指定することもできます。その場合、(7)の指定も有効です。
(9) *(アスタリスク)
アスタリスクの前にある(1)から(8)までの形の正規表現の0回以上の繰り返しを表
します。前にあるのが(1)から(8)以外の時、アスタリスクそのものに対応します。
(10) +(プラス)
プラスの前にある(1)から(8)までの形の正規表現の1回以上の繰り返しを表します。
前にあるのが(1)から(8)以外の時、プラスそのものに対応します。
(11) ?
?の前にある(1)から(8)までの形の正規表現の0回以上1回以下の繰り返しを表し
ます。前にあるのが(1)から(8)以外の時、?そのものに対応します。
(12) 「¥<」、「¥>」
「¥<」に続く正規表現はそれが単語の先頭にあることを意味します。正規表現の
あとに「¥>」がある時、その正規表現は、単語の終わりにあることを意味します。
単語の先頭とは、対応させる文字列の先頭であるかもしくは、一文字前の文字が、
次に示す区切り文字であり、そこの文字が次に示す区切り文字でないことです。
単語の終わりとは、対応させる文字列の終わりであるかもしくは、そこの文字が次
に示す区切り文字であり、一文字前の文字が、次に示す区切り文字でないことです。
区切り文字
¥b¥n¥t¥f .,!"#$%&'()=^`|~@[]{}<>-+*/?_¥
2バイトコードすなわち漢字に単語の概念はあまり意味が無いので区切り文字
は設定されていません。
(13) 「正規表現x」「正規表現y」
(1)から(13)までの形をした正規表現xのあとに(1)から(12)までの形をした正規表
現yを続けることができます。この場合、xに対応したあとの部分がyに対応して
いるとき、全体の対応が成功します。
(14) ^(山)、$(ドル)
^に続く正規表現はそれが行の先頭にあることを表します。全体の正規表現の先頭
に無いときは、^そのものに対応します。正規表現のあとに$がある時、その正規
表現は、行の終わりにあることを表します。全体の正規表現の最後に無いときは、
$そのものに対応します。行の先頭とは、対応させる文字列の先頭であるかもしく
は、一文字前の文字が改行文字「¥n」であることです。行の終わりとは、対応さ
せる文字列の終わりであるかもしくは、改行文字の上にあることです。
2. 関数
このライブラリが提供している関数を次に示します。
2.1 recomp
形式
RePat*
recomp (PatternString)
Char *PatternString;
説明
PatternStringに指定されている正規表現を内部データ形式にコンパイルしま
す。内部データ形式は、RePatという抽象型のデータ構造で、reexp.hに定義
されています。データ領域は、mallocおよびcallocによって確保されます。
戻り値
RePat構造体へのポインタが返されます。NULLのときmallocもしくはcallocに
エラーがあったことを表します。それ以外、例えば、正規表現の指定の仕方
が間違った場合などはエラーとはしていませんので注意して下さい。
2.2 refree
形式
void
refree (PatternPtr)
RePat *PatternPtr;
説明
recompによって確保された領域を解放します。これ以外の方法で、解放する
ときは、RePat構造体の内容を熟知したうえで行う必要があります。
戻り値
無し。
2.3 re_search_forward
形式
Bool
re_search_forward (PatternPtr,BufString,StartPosition)
RePat *PatternPtr;
Char *BufString;
Int *StartPosition;
説明
BufStringのStartPositionから前方へPatternPtrで示される正規表現を探し
ます。Charは、"unsigned char" Intは、"int" Boolは、"int"とそれぞれ定
義されています。
StartPositionは、先頭からのバイト単位のオフセットで、漢字の1バイトめ
と2バイト目に跨る位置に指定してはいけません。
実行の際に、re_ignore_caseがTRUEのときアルファベットの大文字小文字を
無視して実行されます。
戻り値
TRUE・・・・成功
FALSE・・・失敗
2.4 re_search_backward
形式
Bool
re_search_backward (PatternPtr,BufString,StartPosition)
RePat *PatternPtr;
Char *BufString;
Int StartPosition;
説明
後方へ探索することを除いて2.3と同じです。
ただし、効率は、メチャクチャ悪いのであまり使わない方がいいと思います。
2.5 redump
形式
void
redump (PatternPtr)
RePat *PatternPtr;
説明
PatternPtrで示されるデータを適当に標準出力に出力します。
デバッグ用なのであまり意味はありません。
戻り値
無し。
2.6 re_init_func
形式
void
re_init_func (Curr,Prev,Next)
Kanji (*Curr)();
Kanji (*Prev)();
Kanji (*Next)();
説明
re_search_forwardおよびre_search_backward関数において、バッファの文字
を返す関数を指定します。これを使用することによりユーザーが、バッファ
内の表現形式を設定し(例えば、すべて2バイトコードで表現されたバッフ
ァ)同関数の高速化をはかることができます。各関数は次の形式です。
Kanji Curr(Pos)
Int Pos; /* Must return character at Pos */
Kanji Prev(Pos,PrevPos)
Int Pos; /* Current position */
Int *PrevPos; /* Must return previous position and character at */
/* (*PrevPos) */
Kanji Next(Pos,NextPos)
Int Pos; /* Current position */
Int *NextPos; /* Must return next position and character at */
/* (*NextPos) */
Posが負値であるか、もしくは、バッファの長さを越える値であるときは、0
を返さなければなりません。この時も、PrevPosおよびNextPosの値は、更新
してください。つまり、Posが0でPrevが呼ばれたら、PrevPosに-1を設定し
0を返すわけです。
また、この関数を使ったときには、re_search_forwardおよびre_search_
backwardの引き数BufStringは無視されます。
この関数設定を実行しない場合、デフォルトの関数が設定されます。
戻り値
特に無し。
2.7 re_version
形式
Char *
re_version ()
説明
本ライブラリのバージョン等を返します。
戻り値
バージョンを含んだ文字列。
3. マクロ
3.1 BeginOfMatch
形式
Int
BeginOfMatch(PatternPtr,No)
RePat *PatternPtr;
Char No;
説明
re_search_forwardもしくはre_search_backwardによって成功したときその開
始位置を得ます。
Noが0のとき全体を表します。1から9までのとき1の㈯に相当します。
戻り値
対応する開始位置。
3.2 EndOfMatch
形式
Int
EndOfMatch(PatternPtr,No)
RePat *PatternPtr;
Char No;
説明
終了位置が返されることを除いて3.1と同じ。ただし、返される位置は、マ
ッチした文字の次の文字を示す位置です。
戻り値
対応する終了位置。
3.3 IsSuccess
形式
IsSuccess(PatternPtr,No)
RePat *PatternPtr;
Char No;
説明
Noに対応する正規表現パターンマッチが成功したかどうかを判定します。
戻り値
0以外・・・・・・・成功
0・・・・・・・・・失敗
4. BSDコンパチライブラリ
4.1 re_comp
形式
char*
re_comp(pattern)
char *pattern;
説明
patternで指定されている正規表現をコンパイルする。patternがNULLポインタ
のとき直前にコンパイルされたものが使用される。
戻り値
NULL・・・・・・・・正常終了
その他・・・・・・・・・エラーメッセージ
ただし、OutOfMemoryは、recompと同じ
4.2 re_exec
形式
int
re_exec(line)
char *line;
説明
直前にコンパイルされた正規表現とlineで指定されている行イメージがマッチ
するかを調べます。これは、re_search_forwardにより実現されています。
戻り値
0以外・・・・成功
0・・・・・・失敗
5. 使い方・その他
使い方といってもたいしてないんですが、既存のアプリケーションを正規表現対応
にするといった場合には、参考になると思います。一応、bsd版とコンパチな(と
本人は思っている)インタフェースがありますので、例えば、lessなんかに組み
込むのも良いでしょう。あるいは、簡単なところでは、grepを作ってみるとかも
できると思います。一応、lessに組み込んでテストはしていますので、大丈夫だ
と思います(−DRECOMP=1をコンパイルのオプションに付ければOKです)。
現仕様上、気になる点を2−3挙げて置きます。まず、なんといっても、特殊文字
の扱いです。私は、特殊文字の場所による依存はあまり好ましくないと思うのですが
習慣的に通常の文字と同じ扱いにしているようなので、それに従うことにしました。
例えば、
"$abc"
というパターンでは、そのもの、つまり、$abcに対応するようにしています。本来、
これは誤りで、次のように指定すべきです。
"¥$abc"
次は、実は、バグなんですが、正規表現のORについてです。次のような文字列でパ
ターンマッチを行った場合です。
"ABCDEFG"
に対して、
"ABC¥|ABCDEFG"
という正規表現で実行すると、最初の ABCに対応してしまい、後の ABCDEFGには対応
しないわけです。本来、正規表現は、一番たくさんマッチしたものを表すべきですが、
現在のところ、ORは、最初に見つけたもので終ってしまいます。
6.配布・転載等
このライブラリの著作権は、
pcs23580 Fog
に属します。だたし、PDSとして自由に配布・転載して貰って結構です。カスタマ
イズする場合や他のアプリケーションに組み込んで使うことも自由ですが、このライ
ブラリを使ったアプリケーション等は、PDSでなければなりません。また、そのユ
ーザーに、このライブラリを使った事が分かるようにしておいて下さい。その際、こ
のドキュメントをこのままの内容で添付して下さい。
Fog / pcs23580